package com.eduagent.xwqeduagent.api.RealTimeVoiceToTextConversion.util;

import com.eduagent.xwqeduagent.api.RealTimeVoiceToTextConversion.constant.RealTimeASRConstant;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Date;

/**
 * 讯飞实时语音转写API鉴权工具类
 */
public class AuthUtil {

    /**
     * 生成签名
     *
     * @param appId 应用ID
     * @param ts 时间戳，从1970年1月1日0点0分0秒开始到现在的秒数
     * @return 签名字符串
     * @throws Exception 签名过程中的异常
     */
    public static String generateSignature(String appId, String ts) throws Exception {
        // 根据文档，签名生成过程：
        // 1. 获取baseString，由appid和当前时间戳ts拼接而成
        String baseString = appId + ts;
        
        // 2. 对baseString进行MD5
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] md5Bytes = md5.digest(baseString.getBytes(StandardCharsets.UTF_8));
        String md5String = bytesToHex(md5Bytes);
        
        // 3. 使用API_KEY作为密钥对MD5结果进行HmacSHA1加密，然后Base64编码
        Mac mac = Mac.getInstance("HmacSHA1");
        
        // 使用API_KEY作为密钥，确保它不为空且类型正确
        if (RealTimeASRConstant.API_KEY == null || RealTimeASRConstant.API_KEY.isEmpty()) {
            throw new Exception("API_KEY不能为空");
        }
        
        SecretKeySpec spec = new SecretKeySpec(
                RealTimeASRConstant.API_KEY.getBytes(StandardCharsets.UTF_8),
                "HmacSHA1");
                
        mac.init(spec);
        byte[] hmacSha1Bytes = mac.doFinal(md5String.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hmacSha1Bytes);
    }

    /**
     * 生成鉴权URL
     *
     * @param params 额外的参数，如lang, pd等
     * @return 完整的WebSocket URL
     * @throws Exception 生成过程中的异常
     */
    public static String generateAuthUrl(String... params) throws Exception {
        // 确保APP_ID不为空
        if (RealTimeASRConstant.APP_ID == null || RealTimeASRConstant.APP_ID.isEmpty()) {
            throw new Exception("APP_ID不能为空");
        }
        
        // 获取当前时间戳，秒级
        String ts = String.valueOf(System.currentTimeMillis() / 1000);
        
        // 生成签名
        String signature = generateSignature(RealTimeASRConstant.APP_ID, ts);
        
        // 构建鉴权参数字符串，不包含WebSocket URL
        StringBuilder urlBuilder = new StringBuilder();
        
        // 添加核心鉴权参数
        // 确保所有参数都是URL编码的 - 尝试不同的格式
        urlBuilder.append("appid=").append(RealTimeASRConstant.APP_ID);
        urlBuilder.append("&ts=").append(ts);
        urlBuilder.append("&signa=").append(URLEncoder.encode(signature, "UTF-8"));
        
        // 打印原始签名用于调试
        System.out.println("原始签名: " + signature);
        System.out.println("编码后签名: " + URLEncoder.encode(signature, "UTF-8"));
        
        // 添加其他业务参数
        if (params != null && params.length > 0 && params[0] != null) {
            for (String param : params) {
                if (param != null && !param.isEmpty()) {
                    urlBuilder.append("&").append(param);
                }
            }
        }
        
        // 添加host_meta参数，可能需要此参数
        urlBuilder.append("&host_meta=1");
        
        // 构建最终URL，使用getCurrentWebsocketURL方法
        String finalUrl = RealTimeASRConstant.getCurrentWebsocketURL() + "?" + urlBuilder.toString();
        
        // 打印生成的URL用于调试
        System.out.println("生成的鉴权URL: " + finalUrl);
        
        return finalUrl;
    }
    
    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param bytes 字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
} 